package main

import (
	"fmt"
	"strings"
)

const (
	Cyan = iota
	Magenta
	Yellow
)

const a = 5

/*
BitFlag 类型的变量可以表示任何整型值，然而由于BitFlag是一个不同类型，因此只有将其转换成
int 型后才能与 int类型数据一起操作。
*/
type BitFlag int

/**
go很容易控制自定义类型的打印，如果某个类型定义了String()方法，那么fmt包中的打印函数就会使用它来进行打印。
因此，可以给 类型添加String方法。
*/
func (flg BitFlag) String() string {
	var flags []string
	if flg&Active == Active {
		flags = append(flags, "Active")
	}
	if flg&Send == Send {
		flags = append(flags, "Send")
	}
	if flg&Receive == Receive {
		flags = append(flags, "Receive")
	}
	if len(flags) > 0 { //int(flg)用于防止无限循环，至关重要
		return fmt.Sprintf("%d(%s)", int(flg), strings.Join(flags, "|"))

	}
	return "0()"

}

/* iota可以与 浮点数 表达式以及自定义类型一起使用*/
const (
	Active  BitFlag = 1 << iota // 1<<0 =1
	Send                        //隐式地设置成 BitFlag = 1 << iota// 1<<1=2
	Receive                     //隐式地设置成 BitFlag = 1 << iota// 1<<2=4
)

/***

 */
func main() {
	fmt.Println(a, Yellow)
	fmt.Println("Active,Send,Receive is", Active, Send, Receive) // 1 2 4

	flag := Active | Send
	fmt.Println(flag)
	println(BitFlag(0))

	fmt.Println(1 & 1)
	fmt.Println(1 & 3)

}
